package ar.fiuba.tp7552.buildadmin.model.gastos;

import java.math.BigDecimal;
import java.util.Date;

import ar.fiuba.tp7552.buildadmin.model.BusinessException;

public class GastoReal extends Gasto {
	
	private String razonSocial;
	private String nroFactura;
	private Date fecha;
	private String formaPago;
	
	// ~~ logica de negocio =========================================================
	@Override
	public void consolidar() throws BusinessException {
		if (this.getConsolidado())
			throw new BusinessException("El gasto ya se encuentra consolidado.");
		
		TipoGasto tipo = this.getTipo();
		if ( Categoria.EXTRAORDINARIO.equals(tipo.getCategoria())) {
			BigDecimal fondoEdificio = this.getEdificio().getFondoExtOrdinario();
			BigDecimal saldo = this.saldo(fondoEdificio, getMonto());
			this.getEdificio().setFondoExtOrdinario(saldo);
		} else {
			BigDecimal fondoEdificio = this.getEdificio().getFondoOrdinario();
			BigDecimal saldo = this.saldo(fondoEdificio, getMonto());
			this.getEdificio().setFondoOrdinario(saldo);
		}
		
		this.setConsolidado(Boolean.TRUE);
	}
	
	
	/**
	 * Calcula el saldo del fondo al descontar un gasto, realizando las validaciones
	 * necesarias.
	 * @param fondo
	 * @param monto
	 * @return
	 */
	private BigDecimal saldo(BigDecimal montoFondo, BigDecimal montoGasto) throws BusinessException {
		if (this.getMonto() == null || this.getMonto().doubleValue() <= 0)
			throw new BusinessException("El monto del gasto debe ser mayor a cero.");
		
//		if ( montoFondo == null || montoGasto.doubleValue() > montoFondo.doubleValue() ) {
//			throw new BusinessException("El monto del gasto es mayor al fondo disponible.");
//		}
		return montoFondo.subtract(this.getMonto());
	}
	
	
	public String getRazonSocial() {
		return razonSocial;
	}

	public void setRazonSocial(String razonSocial) {
		this.razonSocial = razonSocial;
	}
	public String getNroFactura() {
		return nroFactura;
	}
	public void setNroFactura(String nroFactura) {
		this.nroFactura = nroFactura;
	}
	public Date getFecha() {
		return fecha;
	}
	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	public String getFormaPago() {
		return formaPago;
	}
	public void setFormaPago(String formaPago) {
		this.formaPago = formaPago;
	}
}
